<template>
  <h2>当前求和：{{ sum }}</h2>
  <button @click="add">点击+1</button>
  <h2>当前信息：{{ msg }}</h2>
  <button @click="msg += '!'">点击增加感叹号</button>
  <br />
  <h1>姓名：{{ person.name }}</h1>
  <h1>年龄：{{ person.age }}</h1>
  <button @click="person.name += '~'">修改姓名</button>
  <br />
  <button @click="person.age++">增长年龄</button>
  <br />
  <h1>薪资：{{ person.job.j1.salary }}K</h1>
  <br />
  <button @click="person.job.j1.salary++">涨薪</button>
</template>

<script>
// 体现出了组合式API的使用
import { ref, watch, reactive } from "vue";
export default {
  name: "myDemo",
  setup() {
    let sum = ref(0);
    let msg = ref("你好啊");
    let person = reactive({
      name: "张三",
      age: 18,
      job: {
        j1: {
          salary: 10,
        },
      },
    });

    function add() {
      sum.value++;
    }

    // 情况一：监视ref定义的一个响应式数据
    // watch(sum, (newValue, oldValue) => {
    //   console.log("sum数据变化了：", newValue, oldValue);
    // });

    // 情况二：监视ref多个属性，参数位置：监视对象,数据回调函数,配置项
    // watch(
    //   [sum, msg],
    //   (newValue, oldValue) => {
    //     console.log("sum数据变化了：", newValue[0], oldValue[0]);
    //     console.log("msg数据变化了：", newValue[1], oldValue[1]);
    // );

    /**
     * 情况三：监视reactive定义的对象全部属性
     * 1.注意：变化后新旧值一样(bug)，只能把所有属性分别用ref定义来解决
     * 2.注意：强制开启了深度监听(deep:false无效)
     * */
    // watch(person, (newValue, oldValue) => {

    //   console.log("person数据变化了：", newValue, oldValue);
    // }, { deep: false });

    // 情况四：监视reactive定义的一个响应式数据的某个属性
    //        属性必须得写成箭头函数，否则无法监视到
    // watch(
    //   ()=>person.age,
    //   (newValue, oldValue) => {
    //     console.log("person数据变化了：", newValue, oldValue);
    //   },
    // );

    // 情况五：监视reactive定义的一个响应式数据的某些属性
    //   watch(
    //   [()=>person.name, ()=>person.age],
    //   (newValue, oldValue) => {
    //     console.log("sum数据变化了：", newValue[0], oldValue[0]);
    //     console.log("msg数据变化了：", newValue[1], oldValue[1]);
    //   },
    // );

    // 特殊情况
        watch(
       ()=>person.job,
      (newValue, oldValue) => {
        console.log("person数据变化了：", newValue, oldValue);
          },
      {deep:true}//此处由于监视的是reactive中的某个对象属性(因为这时已经是至少2层了)，deep配置有效
    );

    return {
      sum,
      add,
      msg,
      person,
    };
  },
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped></style>
